package com.example.wheelview;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;

import com.orhanobut.android.dialogplussample.R;

import java.util.Calendar;


/**
 * 弹窗
 */
public class PicPopupWindow extends PopupWindow {

    private Context context;
    private Calendar calendar;  // 实例化日历

    // 控件
    private View view;
    private WheelView tv_year;     // 显示 2016年
    private WheelView tv_month;    // 显示 5月
    private WheelView tv_day;      // 显示 24日

    // 变量
    private int mYear;		    // 年
    private int mMonth;			// 月
    private int mDay;			// 日


    private Button mBtn_ok;      // 确定按钮



    /**
     * 确定键监听器
     * @param listener
     */
    public void setOnPositiveListener(View.OnClickListener listener){
        mBtn_ok.setOnClickListener(listener);
    }

    /**
     * 构造方法
     * @param context
     */
    @SuppressLint("InflateParams")
    public PicPopupWindow(Activity context) {
        super(context);
        calendar = Calendar.getInstance();

        this.context = context;
        this.mYear = calendar.get(Calendar.YEAR);
        this.mMonth = calendar.get(Calendar.MONTH);
        this.mDay = calendar.get(Calendar.DATE);


        this.setContentView(view);                                 // 设置SelectPicPopupWindow的View
        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);        // 设置SelectPicPopupWindow弹出窗体的宽
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);       // 设置SelectPicPopupWindow弹出窗体的高
        this.setFocusable(true);                                   // 设置SelectPicPopupWindow弹出窗体可点击
//        this.setAnimationStyle(R.style.AnimBottom);                // 设置SelectPicPopupWindow弹出窗体动画效果

        // 0xb0000000 (透明黑)
        ColorDrawable dw = new ColorDrawable(00000000);            // 实例化一个ColorDrawable颜色为半透明
        this.setBackgroundDrawable(dw);                            // 设置SelectPicPopupWindow弹出窗体的背景

    }


    /**
     * 构造方法
     * @param context
     * @param mYear     年
     * @param mMonth    月
     * @param mDay      日
     */
    @SuppressLint("InflateParams")
    public PicPopupWindow(Activity context,int mYear,int mMonth,int mDay) {
        super(context);
        calendar = Calendar.getInstance();

        this.context = context;
        this.mYear = mYear;
        this.mMonth = mMonth;
        this.mDay = mDay;

        this.setContentView(view);                                 // 设置SelectPicPopupWindow的View
        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);        // 设置SelectPicPopupWindow弹出窗体的宽
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);       // 设置SelectPicPopupWindow弹出窗体的高
        this.setFocusable(true);                                   // 设置SelectPicPopupWindow弹出窗体可点击
        this.setAnimationStyle(R.style.AnimBottom);                // 设置SelectPicPopupWindow弹出窗体动画效果

        // 0xb0000000 (透明黑)
        ColorDrawable dw = new ColorDrawable(00000000);            // 实例化一个ColorDrawable颜色为半透明
        this.setBackgroundDrawable(dw);                            // 设置SelectPicPopupWindow弹出窗体的背景

    }


    /**
     * 实例化父级视图
     * @param view
     */
    public void addContentView(View view) {
        this.view = view;
        setCustomDialog();
    }


    /**
     * 设置 自定义
     */
    @SuppressLint("ClickableViewAccessibility")
    private void setCustomDialog() {

        mBtn_ok = view.findViewById(R.id.btn_ok);

        int norYear = calendar.get(Calendar.YEAR);			// 获取 今年

        int curYear = mYear;				// 当前 年
        int curMonth = mMonth;		        // 当前 月
        int curDate = mDay;					// 当前 日

        // 年 设置显示效果(例如:2016年)
        tv_year = view.findViewById(R.id.year);
        NumericWheelAdapter numericWheelAdapter1 = new NumericWheelAdapter(context,1950, norYear);  // 最小值(1950)	// 最大值(今年)
        numericWheelAdapter1.setLabel("年");															// set 标签
        tv_year.setViewAdapter(numericWheelAdapter1);												// 关联 视图适配器
        tv_year.setCyclic(true);																	// 启用循环
        tv_year.addScrollingListener(scrollListener);												// 加载	滚动监听

        // 月 设置显示效果(例如:05月)
        tv_month = view.findViewById(R.id.month);
        NumericWheelAdapter numericWheelAdapter2 = new NumericWheelAdapter(context,1, 12, "%02d"); 	// 最小值(1)	// 最大值(12) // 固定格式(%02d)
        numericWheelAdapter2.setLabel("月");														    // set 标签
        tv_month.setViewAdapter(numericWheelAdapter2);												// 关联 视图适配器
        tv_month.setCyclic(true);																	// 循环
        tv_month.addScrollingListener(scrollListener);												// 加载	滚动监听

        // 日
        tv_day = view.findViewById(R.id.day);
        NumericWheelAdapter numericWheelAdapter = new NumericWheelAdapter(context,1, getDay(curYear, curMonth), "%02d");    // 最小值(1)	// 最大值(计算) // 固定格式(%02d)
        numericWheelAdapter.setLabel("日");				                                            // set 标签
        tv_day.setViewAdapter(numericWheelAdapter);		                                            // 关联 视图适配器
        tv_day.setCyclic(true);							                                            // 循环
        tv_day.addScrollingListener(scrollListener);

        // 显示 选择数量
        tv_year.setVisibleItems(7);		    // 年
        tv_month.setVisibleItems(7);		// 月
        tv_day.setVisibleItems(7);			// 日


        tv_year.setCurrentItem(curYear - 1950);
        tv_month.setCurrentItem(curMonth - 1);
        tv_day.setCurrentItem(curDate - 1);


        // mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框
        view.setOnTouchListener((v, event) -> {

            int height = view.findViewById(R.id.pop_layout).getTop();
            int y = (int) event.getY();
            if (event.getAction() == MotionEvent.ACTION_UP) {
                if (y < height) {
                    dismiss();
                }
            }
            return true;
        });

        super.setContentView(view);
    }

    /**
     * 获取年
     */
    public int getYear(){
        return mYear;
    }

    /**
     * 获取月
     */
    public int getMonth(){
        return mMonth;
    }

    /**
     * 获取日
     */
    public int getDay(){
        return mDay;
    }


    // 轮滚动监听
    OnWheelScrollListener scrollListener = new OnWheelScrollListener() {

        public void onScrollingStarted(WheelView wheel) {

        }

        // 滚动完成
        public void onScrollingFinished(WheelView wheel) {
            // 获取 年月日数据
            int curYear = tv_year.getCurrentItem() + 1950;				// 年(最早)
            int curMonth = tv_month.getCurrentItem() + 1;				// 月(最小)
            NumericWheelAdapter numericWheelAdapter=new NumericWheelAdapter(context,1, getDay(curYear, curMonth), "%02d");
            numericWheelAdapter.setLabel("日");				// set 标签
            tv_day.setViewAdapter(numericWheelAdapter);		// 关联 视图适配器

            int curDate = tv_day.getCurrentItem() + 1;

            // 更新数据
            mYear = curYear;
            mMonth = curMonth;
            mDay = curDate;

        }
    };


    /**
     * 计算最大天数
     * @param year		年
     * @param month		月
     */
    private int getDay(int year, int month) {

        int day;

        boolean flag;

        switch (year % 4) {

            case 0:
                flag = true;
                break;

            default:
                flag = false;
                break;
        }

        switch (month) {

            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                day = 31;

                break;

            case 2:
                day = flag ? 29 : 28;
                break;

            default:
                day = 30;
                break;
        }
        return day;
    }



}